﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using DA_OOMModel;
using System.Data;
using System.Reflection;
using DA_OOMDALFactory;
using DA_OOMModelIDAL;
using System.Collections;
using NHibernate.Mapping;
using NHibernate.Cfg;
using DA_OOMNHibernateDAL;
using DaCredito.Controles;

namespace DaCredito
{
    public partial class WebPageForm : WebPage
    {

        protected Type ioTipoEntidade;
        protected Type ioTipoPKEntidade;
        protected Type[] ioListaTipoEntidadeSecundaria;
        private Usuario ioUsuario;
        protected object ioInstanciaEntidade;

       
        public Type Entidade
        {
            get { return ioTipoEntidade; }
            set { ioTipoEntidade = value; }
        }

        protected override void PrePageLoad()
        {

            base.PrePageLoad();
        }
     
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            //base.Page_Load(sender, e);

            string lsIDEntidade = Request.QueryString[ioTipoEntidade.Name]; ;


            this.EncontrarControle("DivCadastro").Visible = true;


            // Por reflexao, recupera a instancia do objeto DAL da Entidade
            MethodInfo loMetodoCriacaoDALEntidade = typeof(ConcreteDALFactory).GetMethod("Create" + ioTipoEntidade.Name + "DAL");
            object loEntidadeDAL = loMetodoCriacaoDALEntidade.Invoke(new ConcreteDALFactory(), null);

            // Por reflexao, recupera o tipo da EntidadePK da Entidade
            Type loTypeEntidadePK = ioTipoEntidade.GetProperty(ioTipoEntidade.Name + "PK", BindingFlags.Public | BindingFlags.Instance).PropertyType;

            // Declara um array com este tipo
            Type[] loTypesEntidadePK = new Type[1] { loTypeEntidadePK };

            // Por reflexao, recupera o metodo Load da Entidade
            MethodInfo loMetodoLoadEntidade = loEntidadeDAL.GetType().GetMethod("Load", loTypesEntidadePK);

            // Cria um array e coloca o ID da Entidade
            //  object[] loParametrosConstrutorPK = new object[1] {Convert.ToInt32(lsTeste)};

            // object loObjetoEntidade = (IList) metodos3.Invoke(ioEntidadeDAL, );
            object loObjetoEntidadePK = Activator.CreateInstance(ioTipoPKEntidade, new object[1] { Convert.ToInt32(lsIDEntidade) });

            ioInstanciaEntidade = loMetodoLoadEntidade.Invoke(loEntidadeDAL, new object[1] { loObjetoEntidadePK });

            // Cliente loCliente = dal.Load(new ClientePK(Convert.ToInt32(lsTeste)));

           // this.CarregaEntidadePagina(ioTipoEntidade, ioInstanciaEntidade);

            /*
            foreach (Type loTipoEntidadeSecundaria in ioListaTipoEntidadeSecundaria)
            {

                IEnumerator a = ((Cliente)loInstanciaEntidade).Usuario.GetEnumerator();
                a.MoveNext();

                //HibernateSessionManager.GetInstance().InitializeObject(((Cliente)loInstanciaEntidade).Usuario);
                this.CarregaEntidadePagina(loTipoEntidadeSecundaria, a.Current);
            }*/

            this.CarregaEntidadesPagina();

        }
        protected virtual void CarregaEntidadesPagina()
        {

        }

        


        protected virtual IList GetListaEntidade(object aoEntidadeDAL)
        {
            // Por refelxao, recupera no banco todos os registros da Entidade
            MethodInfo loMetodoRecuperacaoListaEntidade = aoEntidadeDAL.GetType().GetMethod("Get" + ioTipoEntidade.Name + "List", Type.EmptyTypes);
            return (IList)loMetodoRecuperacaoListaEntidade.Invoke(aoEntidadeDAL, null);

        }
        
       protected override bool OnUpdate()
        {

            // object loObjetoEntidadePK = Activator.CreateInstance(typeof(ClientePK), new object[1] { Convert.ToInt32(lsTeste) });

           /*
            object loInstanciaEntidade = Activator.CreateInstance(ioTipoEntidade);

            //loMetodoLoadEntidade.Invoke(ioEntidadeDAL, new object[1] { loObjetoEntidadePK });

            {
                PropertyInfo[] lopro = ioTipoEntidade.GetProperties();

                foreach (PropertyInfo loprope in lopro)
                {
                    Control loControl = this.EncontrarControle("Column_" + loprope.Name);
                    if (null != loControl)
                    {
                        loprope.SetValue(loInstanciaEntidade, ((WebControl)loControl).Attributes["value"], null);

                    }
                }
            }*/
           /*
            foreach (Type loTipoEntidadeSecundaria in ioListaTipoEntidadeSecundaria)
            {
                PropertyInfo[] lopro = loTipoEntidadeSecundaria.GetProperties();

                foreach (PropertyInfo loprope in lopro)
                {
                    Control loControl = this.EncontrarControle("Column_" + loprope.Name);
                    if (null != loControl)
                    {
                        loprope.SetValue(loInstanciaEntidade, ((WebControl)loControl).Attributes["value"], null);

                    }
                }
            }*/



            //Cliente loCliente = ClasseControladora.CadastrarCliente((Cliente)loInstanciaEntidade);

            return true;
            /*
            string lsRazaoSocial;
            string lsNomeFantasia;
            string lsNumeroCNPJ;
            string lsEmail;
            string lsEnderecoLogradouro;
            string lsEnderecoComplemento;
            string lsEnderecoNumero;
            string lsEnderecoNumeroCep;
            string lsEnderecoNomeBairro;
            string lsEnderecoInscricaoEstadual;
            string lsEnderecoInscricaoMunicipal;
            string lsNickname;
            string lsSenha;
            string lsNome;
            string lsSobrenome;
           
            lsRazaoSocial = RazaoSocial.Text;
            lsNomeFantasia =  NomeFantasia.Text;
            lsNumeroCNPJ = "";
            lsEmail = Email.Text;
            lsEnderecoLogradouro = Logradouro.Text;
            lsEnderecoComplemento = Complemento.Text;
            lsEnderecoNumero = "";
            lsEnderecoInscricaoEstadual = "";
            lsEnderecoInscricaoMunicipal = "";
            lsEnderecoNumeroCep = "";
            lsEnderecoNomeBairro = "";

            lsNickname =  FieldNickname.Text;
            lsSenha =  FieldSenha.Text;
            lsNome = "";
            lsSobrenome = "";

            Cidade loCidade = new Cidade();
            loCidade.CidadePK = new CidadePK(1);

            Cliente loCliente = ClasseControladora.CadastrarCliente(lsRazaoSocial,lsNomeFantasia, lsNumeroCNPJ, lsEmail,
                                  lsEnderecoLogradouro,lsEnderecoComplemento, lsEnderecoNumero,
                                   lsEnderecoInscricaoEstadual,lsEnderecoInscricaoMunicipal,
                                   lsEnderecoNumeroCep, lsEnderecoNomeBairro, 
                                   loCidade,
                                   lsNickname, lsNickname, lsNome, lsSobrenome);
           
          Usuario loUsuario = ClasseControladora.CadastrarUsuario(loCliente, lsNickname, lsSenha,
                                                                  lsNome, lsSobrenome);
        
             return true;*/
        }
    
        

    }
}
